package co.edu.usbcali.egrapico.logica;

import java.util.StringTokenizer;

/**
 * Clase para la traducci�n de la representaci�n de un
 * <Code>M�todo</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo PiCO</I>.
 * <P> Recibe en <I>GraPiCO Textual</I>:<P> <Blockquote><Pre> Nombre_M�todo:(ListaPar�metros) Programa
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> de cada
 * constructor:<P> <Blockquote><Pre> Nombre_M�todo:(ListaPar�metros) Programa
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class Method {

    // Variable para almacenar el m�todo representado en c�lculo PiCO.
    String methodPico = "";
    // Variable para almacenar el nombre del m�todo.
    String nameMethod = "";
    // Variables para almacenar  la lista de par�metros y un programa
    // en GraPiCO Textual
    String parametersListGraPicoT = "", programGraPicoT = "";
    // Lista de par�metros en c�lculo PiCO
    String parametersListPiCO = "";
    // Objeto de la clase IdentifiersList, para la traducci�n de la lista de
    // par�metros.
    IdentifiersList parametersList;
    // Objeto de la clase Programa.
    Program program;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de clase
     * <Code>Method</Code>.<P> Divide el
     * <Code>M�todo</Code> en las tres partes que lo conforman:
     * <Code>Nombre del m�todo</Code>,
     * <Code>Lista de Par�metros</Code> y
     * <Code>Programa</Code> en <I>GraPiCO Textual</I>.
     *
     * @param methodGraPicoT Expresi�n equivalente a la representaci�n de un
     * <Code>M�todo</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public Method(String methodGraPicoT, String nameProcess) {

        // Se obtiene el nombre o lista de nombres de procesos.
        nameCurrentProcess = nameProcess;

        // Se obtiene el nombre del m�todo
        nameMethod = methodGraPicoT.substring(0, methodGraPicoT.indexOf(":"));

        // Lista de par�metros en GraPiCO Textual
        parametersListGraPicoT = methodGraPicoT.substring(nameMethod.length() + 2, methodGraPicoT.indexOf("{") - 1);

        // Programa del m�todo
        programGraPicoT = methodGraPicoT.substring(methodGraPicoT.indexOf("{") + 1);
    }

    /**
     * Metodo generador de la traducci�n de un
     * <Code>M�todo</Code>.<P> Se obtiene la traducci�n de la
     * <Code>Lista de Par�metros</Code> y del
     * <Code>Programa</Code> a <I>C�lculo PiCO</I>, para ser concatenados con el
     * <Code>Nombre del m�todo</Code>. <P>El
     * <Code>Nombre del m�todo</Code>, es registrado en la <I>tabla de
     * implementaciones</I> de m�todos para le n�lisis sem�ntico.
     *
     * @return el
     * <Code>M�todo</Code> traducido a <I>C�lculo PiCO</I>.
     */
    public String traslate() {
        parametersList = new IdentifiersList(parametersListGraPicoT, "P", nameCurrentProcess);
        program = new Program(programGraPicoT, nameCurrentProcess);

        // Se obtiene la traducci�n de la lista de par�metros
        parametersListPiCO = parametersList.traslate();

        // Se obtiene el n�mero de par�metros de la lista obtenida
        StringTokenizer stParametersPico = new StringTokenizer(parametersListPiCO, ",");
        int nuParameters = stParametersPico.countTokens();

        // Se registra la implementaci�n del m�todo
        SemanticAnalizer.PutImplementedMethods(nameMethod, nameCurrentProcess, new Integer(nuParameters).toString());

        // Se forma la traducci�n del m�todo
        methodPico = nameMethod + ": " + "(" + parametersListPiCO + ") " + program.traslate();
        return methodPico;
    }
}